package com.pluto.queue;

import java.util.Iterator;
import java.util.Stack;

/**
 * 队列
 * 使用双向链表实现
 * 入队操作在队尾,出队操作在队头
 */
public class Queue<Item> implements Iterable<Item> {

    private Node first;     //队列头
    private Node last;      //队列尾

    private int N;          //队列中的元素个数



    private class Node {
        Item item;
        Node next;
    }

    public boolean isEmpty() {
        return first == null;
    }

    public int size() {
        return N;
    }

    /**
     * 入队
     * @param item 添加的元素的值
     */
    public void enqueue(Item item) {
        Node temp = last;
        last = new Node();
        last.item = item;

        /*
         * 如果队列为空,则队列头和队列尾都指向新添加的元素
         * 注意next的使用者是否为null
         */
        if (isEmpty()) {
            first = last;
        } else {
            temp.next = last;
        }
        N++;
    }

    /**
     * 出队
     * @return 从队列出去的元素的值
     */
    public Item dequeue() {
        Item temp = first.item;
        first = first.next;
        N--;
        if (isEmpty()) {
            last = null;
        }
        return temp;
    }


    @Override
    public Iterator<Item> iterator() {
        return null;
    }

    public static void main(String[] args) {

    }


}
